/**
 * @CLASSDESCRIPER:栈：先进后出;使用单链表的形式编写栈的入栈出栈
 * @AUTHOR:tangyi
 * @PHONE:17773063844
 * @EMIAL:ty20020127@163.COM
 * @DATE:2021/1/23
 * @PARAMDESCRIPER:
 * @OUTPARAMDESCRIPER:
 */
public class TANG_YI_23_Q1<T> {

    //头节点
    private Node<T> head;
    //栈中所存在的元素个数
    private int length;

    //自定义构造器
    public TANG_YI_23_Q1(){
        //初始化头节点
        this.head=new Node(null,null);
        //初始化所在元素为0
        this.length=0;
    }

    //获取栈元素的个数
    public int getLength(){
        return length;
    }

    //判断栈是否为空
    public boolean isEmpty(){
        return this.length==0;
    }

    //入栈
    public void push(T t){
        //新对象的构建,并指向头节点指向的下一个节点
        Node node = new Node(t,head.next);
        //头节点指向新构建的节点
        head.next=node;
        //元素个数加1
        this.length++;
    }

    //出栈
    public T pop(){
        //判断栈是否为空，为空则无法出栈
        if (isEmpty()){
            return (T)"栈为空，无法出栈";
        }
        //找到头节点指向的第一个节点
        Node curr = head.next;
        //head节点指向原来的第二个节点
        head.next=curr.next;
        //元素个数减1
        this.length--;
        //返回出栈的t值
        return (T) curr.t;
    }

    //内部类结构
    class Node<T> {
        T t;
        Node<T> next;

        public Node(T t, Node next) {
            this.t = t;
            this.next = next;
        }
    }

    //main方法测试
    public static void main(String[] args) {
        TANG_YI_23_Q1 tang_yi_23_q1 = new TANG_YI_23_Q1();
        tang_yi_23_q1.push(1);
        tang_yi_23_q1.push(2);
        tang_yi_23_q1.push(30);
        tang_yi_23_q1.push(80);
        System.out.println("栈长："+tang_yi_23_q1.getLength());
        System.out.println("头节点下一个节点的t值为："+tang_yi_23_q1.head.next.t);
        System.out.println("出栈的节点t值："+tang_yi_23_q1.pop());
        System.out.println("栈长："+tang_yi_23_q1.getLength());
        System.out.println("头节点下一个节点的t值为："+tang_yi_23_q1.head.next.t);
        System.out.println("出栈的节点t值："+tang_yi_23_q1.pop());
        System.out.println("栈长："+tang_yi_23_q1.getLength());
        System.out.println("头节点下一个节点的t值为："+tang_yi_23_q1.head.next.t);
        System.out.println("出栈的节点t值："+tang_yi_23_q1.pop());
        System.out.println("栈长："+tang_yi_23_q1.getLength());
        System.out.println("头节点下一个节点的t值为："+tang_yi_23_q1.head.next.t);
        System.out.println("出栈的节点t值："+tang_yi_23_q1.pop());
        System.out.println("栈长："+tang_yi_23_q1.getLength());
        System.out.println("出栈的节点t值："+tang_yi_23_q1.pop());
    }
    /**
     * 问题：
     *      应该没有
     */
}
